const crypto = require('crypto');

// 重用的设置加密信息函数
function getCipher(key, iv, mode = 'encrypt') {
	const method = mode === 'encrypt' ? 'createCipheriv' : 'createDecipheriv';
	return crypto[method]("aes-128-cbc", Buffer.from(key), Buffer.from(iv));
}

/** 加密函数
 * @param {Object} text 需要加密的文本
 * @param {Object} key 加密密钥
 * @param {Object} iv 加密向量
 * @returns {string} 加密后的文本
 */
function encrypt(text, key, iv) {
	if (!text || !key || !iv) throw new Error('加密时缺少必要参数');
	const cipher = getCipher(key, iv, 'encrypt');
	let encrypted = cipher.update(text, 'utf8', 'hex');
	encrypted += cipher.final('hex');
	return encrypted;
}

/**
 * 解密函数
 * @param {Object} encryptedText 需要解密的文本
 * @param {Object} key 解密密钥
 * @param {Object} iv 解密向量
 * @returns {string} 解密后的文本
 */
function decrypt(encryptedText, key, iv) {
	if (!encryptedText || !key || !iv) throw new Error('解密时缺少必要参数');
	const decipher = getCipher(key, iv, 'decrypt');
	let decrypted = decipher.update(encryptedText, 'hex', 'utf8');
	decrypted += decipher.final('utf8');
	return decrypted;
}

module.exports = {
	encrypt,
	decrypt
}